#include "Protocol.hpp"
#include "Socket.hpp"
#include "TcpServer.hpp"
#include "Calculate.hpp"
#include <iostream>
#include <memory>
#include <unistd.h>

using namespace Net_Work;
using namespace Protocol;
using namespace CalculateNS;

// 网络负责IO发送
// HandlerRequest字节流数据解析和调用业务处理方法的
// 处理报文的方法
std::string HandlerRequest(std::string &inbufferstream, bool *error_code)
{
    *error_code = true;
    // 0. 计算机对象
    Calculate calculate;
    // 1.构建相应对象
    std::unique_ptr<Factory> factory = std::make_unique<Factory>();
    auto req = factory->BuildRequest();

    // 2. 分析字节流， 看是否有一个完整的报文
    std::string total_resp_string;
    std::string message;
    while (Decode(inbufferstream, &message))
    {
        std::cout << message << "--message" << std::endl;

        // 3.我一定读到了一个完整的报文， 可以进行反序列化
        if (!req->DeSerialize(message))
        {
            std::cout << "Deserialize error" << std::endl;
            *error_code = false;
            return std::string();
        }
        // 4. 业务处理
        auto resp = calculate.Cal(req);
        // 5.序列化response
        std::string send_string;
        resp->Serialize(&send_string); // "result code"
        // 6. 构建完整的字符串级别的相应报文
        send_string = Encode(send_string);

        total_resp_string += send_string;
    }
    // 7.发送
    return total_resp_string;
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "Usage :" << argv[0] << "port" << std::endl;
        return 0;
    }

    uint16_t localport = std::stoi(argv[1]);
    std::unique_ptr<TcpServer> svr(new TcpServer(localport, HandlerRequest));
    svr->Loop();

    return 0;
}
